home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / smb_host2sid.nasl < prev    next >
Text File  |  2005-01-14  |  12KB  |  487 lines

  1. #
  2. # This script was written by Renaud Deraison <deraison@cvs.nessus.org>
  3. #
  4. # See the Nessus Scripts License for details
  5. #
  6.  
  7. if(description)
  8. {
  9.  script_id(10859);
  10.  script_bugtraq_id(959);
  11.  script_version ("$Revision: 1.17 $");
  12.  script_cve_id("CVE-2000-1200");
  13.  
  14.  name["english"] = "SMB get host SID";
  15.  name["francais"] = "Obtentention du SID de la machine par SMB";
  16.  
  17.  script_name(english:name["english"],
  18.           francais:name["francais"]);
  19.  
  20.  desc["english"] = "
  21.  
  22. This script emulates the call to LsaQueryInformationPolicy()
  23. to obtain the domain (or host) SID (Security Identifier).
  24.  
  25. The domain/host SID can then be used to get the list
  26. of users of the domain or the list of local users
  27.  
  28. Risk factor : Low";
  29.  
  30.  desc["francais"] = "
  31.  
  32. Ce script Θmule la fonction LsaQueryInformationPolicy()
  33. afin d'obtenir le SID du domaine ou de la
  34. machine
  35.  
  36.  
  37. Le SID peut ensuite etre utilisΘ pour rΘcuperer la
  38. liste des utilisateurs du domaine ou les utilisateurs
  39. locaux. 
  40.  
  41. Facteur de risque : faible";
  42.  
  43.  script_description(english:desc["english"],
  44.              francais:desc["francais"]);
  45.  
  46.  summary["english"] = "Gets the domain SID";
  47.  summary["francais"] = "Obtention du SID du domaine";
  48.  script_summary(english:summary["english"],
  49.          francais:summary["francais"]);
  50.  
  51.  script_category(ACT_GATHER_INFO);
  52.  
  53.  script_copyright(english:"This script is Copyright (C) 2000 Renaud Deraison");
  54.  family["english"] = "Windows";
  55.  script_family(english:family["english"]);
  56.  
  57.  script_dependencies("netbios_name_get.nasl",
  58.               "smb_login.nasl", "smb_dom2sid.nasl");
  59.  script_require_keys("SMB/transport", "SMB/name", "SMB/login", "SMB/password");
  60.  script_require_ports(139, 445);
  61.  exit(0);
  62. }
  63.  
  64.  
  65. include("smb_nt.inc");
  66. port = kb_smb_transport();
  67. if(!port)port = 139;
  68.  
  69. #-------------------------------------------------------------#
  70. # return a 28 + strlen(data) + (odd(data)?0:1) long string    #
  71. #-------------------------------------------------------------#
  72. function lsa_unicode(data)
  73. {
  74.  len = strlen(data);
  75.  ret = raw_string(ord(data[0]));
  76.  
  77.  for(i=1;i<len;i=i+1)
  78.  {
  79.   ret = ret + raw_string(0, ord(data[i]));
  80.  }
  81.  
  82.  
  83.  if(!(len & 1)){even = 1;}
  84.  else even = 0;
  85.  
  86.  
  87.  if(even)
  88.   {
  89.   ret = ret + raw_string(0,0,0,0xC9, 0x11, 0x18);
  90.   }
  91.  else
  92.   ret = ret + raw_string(0,0,0,0x18);
  93.  
  94.  for(i=0;i<19;i=i+1)
  95.   ret = ret + raw_string(0);
  96.   
  97.  return(ret);
  98. }
  99.  
  100.  
  101. #---------------------------------------------------------#
  102. # Set up the pipe request by calling LSA_OPENPOLICY       #
  103. #---------------------------------------------------------#
  104.         
  105. function pipe_request_lsa_open_policy_setup(soc, uid, tid, pipe)
  106. {
  107.  tid_low = tid % 256;
  108.  tid_high = tid / 256;
  109.  uid_low = uid % 256;
  110.  uid_high = uid / 256;
  111.  pipe_low = pipe % 256;
  112.  pipe_high = pipe / 256;
  113.  
  114.  req = raw_string(0x00, 0x00,
  115.            0x00, 0x94, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  116.           0x00, 0x00, 0x00, 0x18, 0x03, 0x00, 0x50, 0x81,
  117.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  118.           0x00, 0x06, tid_low, tid_high, 0x00, 0x28, uid_low, uid_high,
  119.           g_mlo, g_mhi, 0x10, 0x00, 0x00, 0x48, 0x00, 0x00,
  120.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  121.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C,
  122.           0x00, 0x48, 0x00, 0x4C, 0x00, 0x02, 0x00, 0x26,
  123.           0x00, pipe_low, pipe_high, 0x51, 0x00, 0x5C, 0x50, 0x49,
  124.           0x50, 0x45, 0x5C, 0x00, 0x00, 0x00, 0x05, 0x00,
  125.           0x0B, 0x00, 0x10, 0x00, 0x00, 0x00, 0x48, 0x00,
  126.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x16,
  127.           0x30, 0x16, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
  128.           0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x78, 0x57,
  129.           0x34, 0x12, 0x34, 0x12, 0xCD, 0xAB, 0xEF, 0x00,
  130.           0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0x00, 0x00,
  131.           0x00, 0x00, 0x04, 0x5D, 0x88, 0x8A, 0xEB, 0x1C,
  132.           0xc9, 0x11, 0x9F, 0xE8, 0x08, 0x00, 0x2B, 0x10,
  133.           0x48, 0x60, 0x02, 0x00, 0x00, 0x00);      
  134.  send(socket:soc, data:req);
  135.  r = smb_recv(socket:soc, length:4096);
  136.  if(!r)return(FALSE);
  137.  if(ord(r[9])==0)return(r);
  138.  else return(FALSE);
  139. }
  140.  
  141.  
  142. #-----------------------------------------------------------------#
  143. # First step : we do _some_ request and we are returned a magic   #
  144. # number that we will use in step 2                               #
  145. #                                                                 #
  146. # (things are starting to get complicated)                        #
  147. #                                                                 # 
  148. #-----------------------------------------------------------------#
  149.  
  150. function pipe_request_lsa_open_policy_step1(soc, uid, tid, pipe, name)
  151. {
  152.  
  153.  tid_low = tid % 256;
  154.  tid_high = tid / 256;
  155.  
  156.  uid_low = uid % 256;
  157.  uid_high = uid / 256;
  158.  
  159.  pipe_low = pipe % 256;
  160.  pipe_high = pipe / 256;
  161.  
  162.  
  163.  uc= lsa_unicode(data:tolower(name));
  164.  tot_len = 136 + strlen(uc);
  165.  
  166.  data_count = 60 + strlen(uc);
  167.  data_count_low  = data_count % 256;
  168.  data_count_high = data_count / 256;
  169.  
  170.  
  171.  len = strlen(name) + 3;
  172.  
  173.  len_low = len % 256;
  174.  len_high = len / 256;
  175.  
  176.  total_data_count = 60 + strlen(uc); 
  177.  total_data_count_low = total_data_count % 256;
  178.  total_data_count_high = total_data_count / 256;
  179.  tot_len_low = tot_len % 256;
  180.  tot_len_high = tot_len / 256;
  181.  bcc = 69 + strlen(uc);
  182.  bcc_low = bcc % 256;
  183.  bcc_high = bcc / 256;
  184.  
  185.  x =  36 + strlen(uc);
  186.  x_low = x % 256;
  187.  x_high = x / 256;
  188.  
  189.  y= 116 + strlen(uc);
  190.  y_low = y % 256;
  191.  y_high = y / 256;
  192.  
  193.  h = raw_string(0x00, 0x00, 
  194.            tot_len_high, tot_len_low, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  195.           0x00, 0x00, 0x00, 0x18, 0x03, 0x00, 0x50, 0x81,
  196.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  197.           0x00, 0x00, tid_low, tid_high,  0x00, 0x28, uid_low, uid_high,
  198.           g_mlo, g_mhi, 0x10, 0x00, total_data_count_high, total_data_count_low, 0x00, 0x00,
  199.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  200.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C,
  201.           total_data_count_high, total_data_count_low, 0x00, 0x4C, 0x00, 0x02, 0x00, 0x26,
  202.           0x00, pipe_low, pipe_high, bcc_low, bcc_high, 0x5C, 0x50, 0x49,
  203.           0x50, 0x45, 0x5C, 0x00, 0x00, 0x00, 0x05, 0x00,
  204.           0x00, 0x03, 0x10, 0x00, 0x00, total_data_count_high, total_data_count_low, 0x00, 
  205.           0x00, 0x00, 0x01, 0x00, 0x00, 0x00, x_low, x_high,
  206.           0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, y_low, 0x34,
  207.           0x13, 0x00, len_low, len_high, 0x00, 0x00, 0x00, 0x00,
  208.           0x00, 0x00, len_low, len_high, 0x00, 0x00, 0x5C, 0x00,
  209.           0x5C, 0x00) + uc + raw_string(
  210.           0x64, 0xFB, 0x12, 0x00, 0x0C, 0x00,
  211.           0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00,
  212.           0x00, 0x02);
  213.           
  214.  send(socket:soc, data:h);
  215.  r = smb_recv(socket:soc, length:4096);
  216.  if(!r)return(FALSE);
  217.  if(ord(r[9])==0)return(r);
  218.  else return(FALSE);
  219. }
  220.  
  221.  
  222. #-------------------------------------------------------------#
  223. # Utility : convert a 4 bytes value to a long               #
  224. #-------------------------------------------------------------#            
  225. function long(s, index)
  226. {
  227.  num = ord(s[index+3]);
  228.  a = num*256;
  229.  num = ord(s[index+2]);
  230.  num = num + a;
  231.  a = num*256;
  232.  num = ord(s[index+1]);
  233.  num = num+a;
  234.  a = num*256;
  235.  num = ord(s[index]);
  236.  num = num+a;
  237.  return(num);
  238. }
  239.  
  240.  
  241. #----------------------------------------------------------#
  242. # Utility : decodes the result of the function step2()     #
  243. #----------------------------------------------------------#
  244.  
  245.  
  246. function decode_sid_hex(s)
  247. {
  248.  local_var sid;
  249.  
  250.  data_offset = ord(s[52]) * 256;
  251.  data_offset = data_offset + ord(s[51]);
  252.  
  253.  
  254.  pad = 46;    #ord(s[59]);
  255.  
  256.  index = data_offset + 4 + pad + 6;
  257.  
  258.  name_len = ord(s[index+1]);
  259.  name_len = name_len * 256;
  260. # display("name_len : ", name_len, "\n");
  261.  name_len = name_len + ord(s[index]);
  262.  odd = name_len & 1;
  263.  
  264.  name_len = name_len * 2;
  265.  name_len = name_len + 4;
  266.  name = "";
  267.  for(i=4;i<name_len;i=i+2)
  268.  {
  269.   name = name + raw_string(ord(s[index+i]));
  270.  }
  271.  index = index + i + 11;
  272.  if(odd)index = index + 2;
  273.  
  274.  sid = NULL;
  275.  sid = raw_string(0, ord(s[index]));
  276.  index = index + 1;
  277.  for(i=0;i<16;i++)sid += s[i+index];
  278.  return(sid);
  279. }
  280.  
  281.  
  282.  
  283.  
  284. function decode_sid(s)
  285. {
  286.  data_offset = ord(s[52]) * 256;
  287.  data_offset = data_offset + ord(s[51]);
  288.  
  289.  
  290.  pad = 46;    #ord(s[59]);
  291.  
  292.  index = data_offset + 4 + pad + 6;
  293.  
  294.  name_len = ord(s[index+1]);
  295.  name_len = name_len * 256;
  296. # display("name_len : ", name_len, "\n");
  297.  name_len = name_len + ord(s[index]);
  298.  odd = name_len & 1;
  299.  
  300.  name_len = name_len * 2;
  301.  name_len = name_len + 4;
  302.  name = "";
  303.  for(i=4;i<name_len;i=i+2)
  304.  {
  305.   name = name + raw_string(ord(s[index+i]));
  306.  }
  307.  index = index + i + 11;
  308.  if(odd)index = index + 2;
  309.  
  310.  sid = "";
  311.  sid = string(ord(s[index]), "-");
  312.  index = index + 1;
  313.  
  314.  num = long(s:s, index:index);
  315.  sid = string(sid, num, "-");
  316.  index = index+4;
  317.  num = long(s:s, index:index);
  318.  sid = string(sid, num, "-");
  319.  index = index+4;
  320.  num = long(s:s, index:index);
  321.  sid = string(sid, num, "-");
  322.  index = index+4;
  323.  num = long(s:s, index:index);
  324.  sid = string(sid, num);
  325.  
  326.  sid = name + " : " + sid; 
  327.  return(sid);
  328.  
  329. }            
  330.  
  331.  
  332. #-----------------------------------------------------------------------#
  333. # This function requests the sid                                        #
  334. #-----------------------------------------------------------------------#
  335.  
  336. function pipe_request_lsa_open_policy_step2(soc, uid, tid, pipe, name, reply)                
  337. {
  338.  
  339.  
  340.  tid_low = tid % 256;
  341.  tid_high = tid / 256;
  342.  
  343.  uid_low = uid % 256;
  344.  uid_high = uid / 256;
  345.  
  346.  pipe_low = pipe % 256;
  347.  pipe_high = pipe / 256;
  348.  
  349.  
  350.  
  351.   req = raw_string(0x00, 0x00,
  352.             0x00, 0x7A, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  353.           0x00, 0x00, 0x00, 0x18, 0x03, 0x00, 0xC2, 0x80,
  354.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  355.           0x00, 0x00, tid_low, tid_high, 0x00, 0x00, uid_low, uid_high,
  356.           g_mlo, g_mhi, 0x10, 0x00, 0x00, 0x2E, 0x00, 0x00,
  357.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  358.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C,
  359.           0x00, 0x2E, 0x00, 0x4C, 0x00, 0x02, 0x00, 0x26,
  360.           0x00, pipe_low, pipe_high, 0x37, 0x00, 0x5C, 0x50, 0x49,
  361.           0x50, 0x45, 0x5C, 0x00, 0x00, 0x00, 0x05, 0x00,
  362.           0x00, 0x03, 0x10, 0x00, 0x00, 0x00, 0x2E, 0x00,
  363.           0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x16, 0x00,
  364.           0x00, 0x00, 0x00, 0x00, 0x07, 0x00);
  365.     
  366.   magic = raw_string(ord(reply[84]));          
  367.   for(i=1;i<20;i=i+1)
  368.   {
  369.    magic = magic + raw_string(ord(reply[84+i]));
  370.   }
  371.   
  372.   req = req + magic + raw_string(0x05, 0x00);
  373.  
  374.   send(socket:soc, data:req);
  375.   r = smb_recv(socket:soc, length:4000);
  376.   return(r);  
  377. }
  378.  
  379.          
  380. #---------------------------------------------------------------------#
  381. # Here is our main()                                                  #
  382. #---------------------------------------------------------------------#
  383.  
  384.  
  385. name = kb_smb_name();
  386. if(!name)exit(0);
  387.  
  388.  
  389. if(!get_port_state(port))exit(0);
  390.  
  391. login = kb_smb_login();
  392. pass  = kb_smb_password();
  393.  
  394. if(!login)login = "";
  395. if(!pass) pass = "";
  396.  
  397. dom = kb_smb_domain();
  398.       
  399. soc = open_sock_tcp(port);
  400. if(!soc)exit(0);
  401.  
  402. #
  403. # Request the session
  404. r = smb_session_request(soc:soc,  remote:name);
  405. if(!r)exit(0);
  406.  
  407. #
  408. # Negociate the protocol
  409. #
  410. prot = smb_neg_prot(soc:soc);
  411. if(!prot)exit(0);
  412.  
  413. #
  414. # Set up our session
  415. #
  416. r = smb_session_setup(soc:soc, login:login, password:pass, domain:dom, prot:prot);
  417. if(!r)exit(0);
  418. # and extract our uid
  419. uid = session_extract_uid(reply:r);
  420.  
  421. #
  422. # Connect to the remote IPC and extract the TID
  423. # we are attributed
  424. #      
  425. r = smb_tconx(soc:soc, name:name, uid:uid, share:"IPC$");
  426. # and extract our tree id
  427. tid = tconx_extract_tid(reply:r);
  428.  
  429.  
  430. #
  431. # Create a pipe to lsarpc
  432. #
  433. r = smbntcreatex(soc:soc, uid:uid, tid:tid, name:"\lsarpc");
  434. if(!r)exit(0);
  435. # and extract its ID
  436. pipe = smbntcreatex_extract_pipe(reply:r);
  437.  
  438. #
  439. # Setup things
  440. #
  441. r = pipe_request_lsa_open_policy_setup(soc:soc, uid:uid, tid:tid, pipe:pipe);
  442. if(!r)exit(0);
  443.  
  444. #
  445. # Get the magic number
  446. #
  447. r = pipe_request_lsa_open_policy_step1(soc:soc, uid:uid, tid:tid, pipe:pipe,name:name);
  448. if(!r)exit(0);
  449.  
  450. #
  451. # Get the SID
  452. #
  453. r = pipe_request_lsa_open_policy_step2(soc:soc, uid:uid, tid:tid,
  454.                    pipe:pipe,name:name, reply:r);
  455.  
  456. if(!r)exit(0);
  457. close(soc);
  458.  
  459.  
  460. #
  461. # Woowoo
  462. #
  463.  
  464.  
  465. host_sid = decode_sid(s:r);
  466. host_sid_hex = hexstr(decode_sid_hex(s:r));
  467.  
  468.  
  469. if("0-0-0-0-0" >< host_sid) exit(0);
  470.  
  471. str = string("The host Security Identifier (SID) can be obtained remotely. Its value is :\n\n",
  472.                host_sid, "\n\n",
  473.               "An attacker can use it to obtain the list of the local users of this host\n",
  474.           "Solution : filter the ports 137-139 and 445\n",
  475.           "Risk factor : Low\n");
  476. security_warning(data:str, port:port);
  477.  
  478.  
  479. domain_sid = string(get_kb_item("SMB/domain_sid"));
  480.  
  481. if((domain_sid == host_sid))exit(0);
  482.  
  483. set_kb_item(name:"SMB/host_sid", value:host_sid);
  484. set_kb_item(name:"SMB/host_sid_hex", value:host_sid_hex);
  485.           
  486.